// 7.2 箭头函数
// 7.3 参数类型和返回类型
//  ​
//  function createUserId(name: string, id: number): string {
//    return name + id;
//  }

// 7.4 函数类型
//  ​
//  let IdGenerator: (chars: string, nums: number) => string;
//  ​
//  function createUserId(name: string, id: number): string {
//    return name + id;
//  }
//  ​
//  IdGenerator = createUserId;

//  7.5 可选参数及默认参数
// 在声明函数时，
// 可以通过 ? 号来定义可选参数，比如 age?: number 这种形式。
// 在实际使用时，需要注意的是可选参数要放在普通参数的后面，不然会导致编译错误。
  // 可选参数
  // function createUserId(name: string, id: number, age?: number): string {
  //   return name + id ;
  // }
   // 默认参数
  // function createUserId(
  //   name: string = "Semlinker", // 默认参数
  //   id: number,
  //   age?: number
  //   ): string {
  //   return name + id;
  // }

  // 7.6 剩余参数
 ​
  // function push(array, ...items) {
  //   items.forEach(function (item) {
  //     array.push(item);
  //   });
  // }
  // ​
  // let a_ts7 = [];
  // push(a_ts7, 1, 2, 3);

//   7.7 函数重载
// 函数重载或方法重载是使用相同名称和不同参数数量或类型创建多个方法的一种能力。
// 要解决前面遇到的问题，方法就是为同一个函数提供多个函数类型定义来进行函数重载，
// 编译器会根据这个列表去处理函数的调用。

 ​type Combinable = string|number ;
 function add(a: number, b: number): number;
 function add(a: string, b: string): string;
 function add(a: string, b: number): string;
 function add(a: number, b: string): string;
 function add(a: Combinable, b: Combinable) {
   if (typeof a === "string" || typeof b === "string") {
     return a.toString() + b.toString();
   }
   return a + b;
 }

//  方法重载是指在同一个类中方法同名，参数不同（参数类型不同、参数个数不同或参数个数相同时参数的先后顺序不同），
// 调用时根据实参的形式，选择与它匹配的方法执行操作的一种技术。
// 所以类中成员方法满足重载的条件是：在同一个类中，方法名相同且参数列表不同。下面我们来举一个成员方法重载的例子：

 ​
 class Calculator {
   add(a: number, b: number): number;
   add(a: string, b: string): string;
   add(a: string, b: number): string;
   add(a: number, b: string): string;
   add(a: Combinable, b: Combinable) {
     if (typeof a === "string" || typeof b === "string") {
       return a.toString() + b.toString();
     }
     return a + b;
   }
 }
 ​
 const calculator = new Calculator();
 const result = calculator.add("Semlinker", " Kakuqo");
 